/*
 * L9Animation.h
 *
 *  Created on: 2011-10-18
 *      Author: baixp
 */

#ifndef L9ANIMATION_H_
#define L9ANIMATION_H_
#include <FBase.h>
#include <FGraphics.h>
#include "L9Util.h"
#include <vector>
using namespace std;
using namespace Osp::Graphics;
using namespace Osp::Base;
namespace lib9bada {
class L9Sprite;
class L9Animation {
private:
	L9Sprite* _sprite;
	int curAnim;

	short _curTime;
	short _curFrame;
	short _anim_PosX;
	short _anim_PosY;
	bool _bPlayOver;
	bool _bLoopPlay;
	/**
	 * 播放动画，将动画绘制在参数graphics上
	 * @param g Graphics
	 */
	vector<int> AnimationSkipFrameIndex;

public:
	/**
	 * 根据sprite对象提供的图形数据来创建索引animIndex所指定的动画
	 * @param L9Sprite* const sprite
	 * @param int animIndex
	 */
	L9Animation(L9Sprite* const sprite, int animIndex);
	/**
	 * 复制动画对象，并重新初始化动画播放信息，比如：播放位置、当前帧为动画开始帧
	 * @param const L9Animation& anim
	 */
	L9Animation(const L9Animation& anim);
	/**
	 *重载赋值操作符,这个操作和复制构造函数往往同时定义
	 *@param const L9Animation& anim
	 */
	L9Animation& operator=(const L9Animation& anim);
	/**
	 * 析构函数,释放动画资源，由于动画数据资源由L9Sprite对象提供，所以这个函数基本为空，也可以不定义，使用默认析构函数
	 */
	virtual ~L9Animation();

	/**
	 * 返回动画帧ID，参数是动画帧索引
	 * @param aframe int
	 * @return int
	 */
	int getAFrameID(int aframe);
	/**
	 * 返回动画帧在动画中的X坐标，参数是动画帧索引
	 * @param aframe int
	 * @return int
	 */
	int getAFrameX(int aframe);

	/**
	 * 返回动画帧在动画中的Y坐标，参数是动画帧索引
	 * @param aframe int
	 * @return int
	 */
	int getAFrameY(int aframe);
	/**
	 * 返回动画帧的播放次数，参数是动画帧索引
	 * @param aframe int
	 * @return int
	 */
	int getAFrameTime(int aframe);

	/**
	 * 获取动画的宽,该动画所有frame的并集宽
	 * @return int
	 */
	int getAnimWidth();
	/**
	 * 获取动画的高,该动画所有frame的并集高
	 * @return int
	 */
	int getAnimHeight();

	/**
	 * 返回每秒动画播放的帧数，即fps值
	 * @return int
	 */
	int getAnimFPS();

	/**
	 * 返回动画的帧数
	 * @return int
	 */
	int getAFrames();

	/**
	 * 获取当前动画帧，表示动画的当前帧索引
	 * @return int
	 */
	int getACurFrame();

	/**
	 * 返回当前帧的当前播放次数，动画帧有可能重复播放
	 * @return int
	 */
	int getACurTime();

	/**
	 * 返回动画的X坐标
	 * @return int
	 */
	int getAnimX();

	/**
	 * 返回动画的Y坐标
	 * @return int
	 */
	int getAnimY();
	/**
	 * 返回动画是否是循环播放
	 * @return bool
	 */
	bool isLoopPlay();

	/**
	 * 设置动画播放的信息,播放那个动画，动画的显示坐标，是否循环播放
	 * @param anim_PosX int
	 * @param anim_PosY int
	 * @param bLoopPlay bool
	 */
	void setAnim(int anim_PosX, int anim_PosY, bool bLoopPlay);

	/**
	 * 设置动画播放信息,当前帧,当前帧Time，是否循环播放
	 * @param int curFrame
	 * @param int curTime
	 * @param bool bPlayOver
	 */
	void setAnimPlayInfo(int curFrame, int curTime, bool bPlayOver);
	/**
	 * 播放动画,实质是设置动画的播放位置,并且将动画初始化为最开始要播放的帧，调用updateAnimation函数才真正的将动画画面播放出来
	 * @param int anim_PosX
	 * @param int anim_PosY
	 */
	void playAnim(int anim_PosX, int anim_PosY);
	/**
	 * 判断动画是否结束,如果为循环播放则始终返回false
	 * @return bool
	 */
	bool isPlayOver();
	/**
	 * 停止动画的播放
	 */
	void stopPlay();
	/**
	 * 设置播放动画时跳过的帧，参数skipFrameIndex是动画中的帧索引
	 * @param vector<int> skipFrameIndex
	 */
	void setSkipFrame(vector<int> skipFrameIndex);
	/**
	 * 播放动画,将动画帧数据绘制到画布Canvas上,并且计算动画的下一帧
	 * @param Canvas* g
	 */
	void updateAnimation(Canvas* g);
};
}
;

#endif /* L9ANIMATION_H_ */
